有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android应用程序等待通知奇怪行为

片段必须等待位图在另一个线程中呈现。为了“提高”性能,我先显示片段,然后从另一个线程粘贴图像。位图线程可能更快,或者片段创建速度更快(哪种更好)。我想在将来创建片段时运行代码,并且可以将位图附加到ImageView

所以我试着用等待和通知来解决这个问题。 服务员线程告诉我位图为空,但在notify线程中,位图被分配给a地址。为什么一个线程正在给我打印一个地址,而另一个线程却在等待(UI线程,onViewCreated())告诉我地址为空

代码:

private static final Object objectWaiterForImage = new Object();


public void onBitmapReady(Bitmap bitmap)
{
    bitmapLastPic = bitmap;

    synchronized (objectWaiterForImage)
    {
        System.out.println("DHH: Calling notify " + objectWaiterForImage);
        objectWaiterForImage.notifyAll();
        System.out.println("DHH: notify called " + objectWaiterForImage);
        System.out.println("DHH: notify called null check " + bitmapLastPic);
    }
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
{
    super.onViewCreated(view, savedInstanceState);

    new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            try
            {
                synchronized (objectWaiterForImage)
                {
                    while(bitmapLastPic == null)
                    {
                        System.out.println("DHH: waiting " + objectWaiterForImage);
                        objectWaiterForImage.wait();
                        System.out.println("DHH: waiting end " + objectWaiterForImage);
                    }



                    new Handler(Looper.getMainLooper()).post(new Runnable() {
                        @Override
                        public void run() {
                            System.out.println("DHH: setting bitmap");
                            imageView.getSource().setImageBitmap(bitmapLastPic);
                            listener.onBitmapReady();
                        }
                    });
                }
            }
            catch (Exception ec)
            {
                System.out.println("onViewCreated() failed: " + ec);
            }
        }
    }).start();

    show();
}

目标是让片段监听另一个线程完成,并显示位图。防止工作线程在片段完成自身创建之前完成。我这么做的原因是,用户不应该等待页面太久。因此,它首先显示ui,几毫秒后显示最终渲染的图像


共 (0) 个答案